import java.util.Scanner;
import java.util.ArrayList;

public class MaqGaseosa extends Maquina{
	private ArrayList <Producto> productos;
	private ArrayList <Venta> ventas;
	
	public MaqGaseosa(){
		super();
		productos = new ArrayList <Producto>();
		ventas = new ArrayList <Venta>();
	}
	
	public void menuMantenimiento()
	{
		Scanner entrada = new Scanner(System.in);
		byte opc = 0;
		
		do 
		{
			System.out.println("===============================================================");
			System.out.println("|                                                             |");
			System.out.println("|             MAQUINA de GASEOSAS o GOLOSINAS                 |");
			System.out.println("|                                                             |");
			System.out.println("===============================================================");
			System.out.println("===============================================================");
			System.out.println("| Ingrese: 1- Agregar producto.                               |");
			System.out.println("| Ingrese: 2- Modificar producto.                             |");
			System.out.println("| Ingrese: 3- Eliminar producto.                              |");
			System.out.println("| Ingrese: 4- Listar productos.                               |");
			System.out.println("===============================================================");
			System.out.println("| Ingrese: 5- Agregar Dinero.                                 |");
			System.out.println("| Ingrese: 6- Modificar Dinero.                               |");
			System.out.println("| Ingrese: 7- Eliminar Dinero.                                |");
			System.out.println("| Ingrese: 8- Listar Dinero.                                  |");
			System.out.println("===============================================================");
			System.out.println("| Ingrese: 9- Listar los Movimientos de Caja.                 |");
			System.out.println("| Ingrese: 10- Listar las Ventas.                             |");
			System.out.println("| Ingrese: 11- Informar ganancias.                            |");
			System.out.println("| Ingrese: 12- Informar veces sin cambio.                     |");
			System.out.println("| Ingrese: 13- Informar veces sin stock.                      |");
			System.out.println("| Ingrese: 0- Salir Menu Mantenimiento.                       |");
			System.out.println("===============================================================");
			System.out.print("\nIngrese opcion:");
			opc = entrada.nextByte();
			switch (opc) 
			{
				case 1: 
					agregarProducto();
					break;
				case 2: 
					modificarProducto();
					break;
				case 3:
					eliminarProducto();
					break;
				case 4:
					listarProductos();
					break;
				case 5:
					super.agregarDinero();
					break;
				case 6:
					super.modificarDinero();
					break;
				case 7:
					super.eliminarDinero();
					break;
				case 8:
					super.listarDineros();
					break;
				case 9:
					super.listarCajas();
					break;
				case 10:
					listarVentas();
					break;
				case 11:
					super.arqueoDeCaja();
					break;
				case 12:
					super.informarVecesSinCambio();
					break;
				case 13:
					informarVecesSinStock();
					break;
			}
		}
		while (opc !=0);
	}
	
	public void menuUsuario()
	{
		Scanner entrada = new Scanner(System.in);
		byte opc = 0;

		do 
		{
			int cont = 0;
			System.out.println("==============================================================");
			System.out.println("|            Ingrese el Producto que desea comprar            |");
			System.out.println("==============================================================");
			for(Producto p:productos )
			{
				if(p.tieneStock())
					System.out.println("Producto: " + cont + " - " + p.darNombre() + " ($ "+p.darPrecio()+" )" );
				else
					System.out.println("Producto: " + cont + " - " + p.darNombre() + " ($ "+p.darPrecio()+" ) - SIN STOCK" );
			
				cont++;
			}
			
			System.out.println(productos.size()+" - Salir");
			opc = entrada.nextByte();
			
			if (opc < productos.size() && opc >= 0)
			{
				if(productos.get(opc).tieneStock())
				{
					float importe = super.ingresarDinero(productos.get(opc).darPrecio());
					
					if (importe >= productos.get(opc).darPrecio() && importe !=0)
					{
						productos.get(opc).venderProducto();
						Caja c = super.agregarCaja(importe, (super.redondeo(importe-productos.get(opc).darPrecio())));
						agregarVenta(productos.get(opc), c);
						
						System.out.println("Tome su cambio de : " + super.redondeo(importe-productos.get(opc).darPrecio()));
						super.entregarCambio(super.redondeo(importe-productos.get(opc).darPrecio()));
						System.out.println("Venta realizada exitosamente, gracias por su compra.");
					}
				
				}
				else
					System.out.println("El producto seleccionado no tiene stock. Seleccione otro producto.");
			}
			else
				if(opc != productos.size())
					System.out.println("La opcion seleccionada no existe. Vuelva a intentar.");
				
		}while (opc != productos.size());	
	}
	
	
	public void agregarProducto()
	{
		Scanner in = new Scanner(System.in);
		in.useDelimiter(System.getProperty("line.separator"));
		System.out.print("Ingrese Codigo: ");
		int cod = in.nextInt();
		
		if(buscarProducto(cod) != null)
		{
			System.out.print("El producto ya existe.");
		}
		else
		{
			int opc = 0;
			do
			{
				System.out.print("1-Gaseosa o 2-Golosina: ");
				opc = in.nextInt();
			}while(opc != 1 && opc != 2);
			
			System.out.print("Ingrese Stock: ");
			int stock = in.nextInt();
			System.out.print("Ingrese Nombre: ");
			String nom = in.next();
			System.out.print("Ingrese Precio: ");
			float precio = in.nextFloat();
			
			Producto nuevo;
			if(opc == 1)
				nuevo = new Gaseosa(cod, stock, nom, precio);
			else
				nuevo = new Golosina(cod, stock, nom, precio);
			productos.add(nuevo);
		}
	}
	
	public void modificarProducto()
	{
		Scanner in = new Scanner(System.in);
		in.useDelimiter(System.getProperty("line.separator"));

		System.out.print("Ingrese Codigo: ");
		int cod = in.nextInt();
		
		Producto prod = buscarProducto(cod);
		
		if(prod == null)
			System.out.print("El producto no existe.");
		else
		{
			if (super.quieroModificar("Stock"))
			{
				System.out.print("Ingrese nuevo Stock: ");
				prod.setStock(in.nextInt());
			}
			if (super.quieroModificar("Nombre"))
			{
				System.out.print("Ingrese Nombre: ");
				prod.setNombre(in.next());
			}
			if (super.quieroModificar("Precio"))
			{
				System.out.print("Ingrese Precio: ");
				prod.setPrecio(in.nextFloat());
			}
		}
	}
	
	public void eliminarProducto()
	{
		Scanner in = new Scanner(System.in);
		in.useDelimiter(System.getProperty("line.separator"));
		
		System.out.print("Ingrese C?digo: ");
		int codigo = in.nextInt();
		
		int i = 0;
		
		while(i<productos.size() && productos.get(i).sos(codigo) != true)
			i++;
		
		if(i < productos.size())
		{
			productos.remove(productos.get(i));
			System.out.print("Producto eliminado.");
		}
		else
			System.out.print("El producto no existe.");
	}
	
	public Producto buscarProducto(int codigo)
	{
		int i = 0;
		
		while(i<productos.size() && productos.get(i).sos(codigo) != true)
			i++;
		
		if(i<productos.size())
			return productos.get(i);
		else
			return null;
	}
	
	public void listarProductos()
	{
		int i = 0;
		
		while(i < productos.size())
		{
			System.out.println(productos.get(i).toString());
			 
			i++;
		}
	}
	
	public void agregarVenta(Producto prod, Caja caja)
	{			
		int cod = Venta.obtenerCodigo();
		
		Venta venta = new Venta(cod, prod, caja);
		
		ventas.add(venta);
	}
		
	public void listarVentas()
	{
		int i = 0;
		
		while(i < ventas.size())
		{
			System.out.println(ventas.get(i).toString());
			 
			i++;
		}
	}
	
	public void informarVecesSinStock()
	{
		int i = 0;
		while (i<productos.size())
		{
			if(productos.get(i).darContSinStock() > 0)
				System.out.println("El producto " + productos.get(i).darNombre() + " se quedo sin stock " + productos.get(i).darContSinStock() + " vez/veces");
			
			i++;
		}
	}

}
